/**
* 联合(union)类型
* 也许称为共享存储类型，表示取值可以为多种类型中的一种。
* 1.定义和用途:
   union允许在相同的内存位置存储不同类型的数据，但在任意时刻只能使用其中一个类型。
   适用于需要在节省内存的情况下灵活存储不同类型数据的场景。
  2.内存布局:
   所有字段共享相同的内存位置。
   这意味着union的大小由其最大字段决定。
  3.安全性与用法:
   由于在同一内存位置存储不同类型，使用时需要特别注意，确保每次只访问当前的有效类型。
   需要使用unsafe块来读取或写入union的字段，因为Rust无法保证类型安全。

   比较难于想象共享存储的使用场景
*/
union Uscore {
    a: u32,
    b: f32,
}

union Ucode {
    a: u8,
    b: char,
}

fn main() {
    let mut u = Uscore { a: 10 };
    unsafe {
        println!("{}", u.b); // 输出：0
        u.b = 20.0;
        println!("{}", u.a); // 输出：20
    }

    println!("---- 现在测试另外一个union类型 ---- ");
    let x: u8 = 87;
    let mut u2 = Ucode { a: x };
    unsafe {
        println!("a={},b={}", u2.a, u2.b);
        u2.b = 'W';
        println!("a={},b={}", u2.a, u2.b);
    }
}
